home *** CD-ROM | disk | FTP | other *** search
- /*//////////////////////////////////////////////////////////////////////////////
- //
- // File: filestrm.cpp
- //
- // Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
- //
- //
- //////////////////////////////////////////////////////////////////////////////*/
- #include "pchgxu.h"
-
- #include "Filestrm.h"
-
- CFileStream::CFileStream(LPCTSTR filename, BOOL bRead, BOOL bTruncate, HRESULT *error)
- {
- m_hfile = CreateFile(filename, bRead ? GENERIC_READ : GENERIC_WRITE, 0, NULL,
- (bTruncate ? CREATE_ALWAYS : OPEN_EXISTING), FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (error)
- {
- ULONG foo = GetLastError();
- if (m_hfile == INVALID_HANDLE_VALUE)
- *error = E_FAIL;
- else
- *error = NOERROR;
- }
- m_cRef = 1;
- }
-
- CFileStream::~CFileStream()
- {
- CloseHandle(m_hfile);
- }
-
- STDMETHODIMP_(ULONG) CFileStream::AddRef(void)
- {
- return m_cRef++;
- }
-
- STDMETHODIMP_(ULONG) CFileStream::Release(void)
- {
- if (--m_cRef != 0)
- return m_cRef;
-
- delete this;
- return 0;
- }
-
-
- STDMETHODIMP CFileStream::QueryInterface(REFIID riid, LPVOID FAR *ppv)
- {
- *ppv=NULL;
- if (riid == IID_IUnknown)
- *ppv=(IUnknown*)this;
- else if (riid == IID_IStream)
- *ppv=(IStream*)this;
- else
- return E_NOINTERFACE;
- ((LPUNKNOWN)*ppv)->AddRef();
- return NOERROR;
- }
-
-
- STDMETHODIMP CFileStream::Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead)
- {
- DWORD read;
- BOOL result = ReadFile(m_hfile, pv, cb, &read, NULL);
- if (pcbRead)
- *pcbRead = read;
- if (result)
- return S_OK;
- else
- return E_FAIL;
- }
-
-
- STDMETHODIMP CFileStream::Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten)
- {
- DWORD written;
- BOOL result = WriteFile(m_hfile, pv, cb, &written, NULL);
- if (pcbWritten)
- *pcbWritten = written;
- if (result)
- return S_OK;
- else
- return E_FAIL;
- }
-
- STDMETHODIMP CFileStream::Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition)
- {
- LONG movelow;
- LONG movehigh;
-
- movelow = dlibMove.LowPart;
- movehigh = dlibMove.HighPart;
-
- DWORD moveMethod;
- switch (dwOrigin)
- {
- case STREAM_SEEK_SET: moveMethod = FILE_BEGIN; break;
- case STREAM_SEEK_CUR: moveMethod = FILE_CURRENT; break;
- case STREAM_SEEK_END: moveMethod = FILE_END; break;
- default: return E_INVALIDARG;
- }
-
-
-
- DWORD result = SetFilePointer(m_hfile, movelow, &movehigh, moveMethod);
-
- if (plibNewPosition)
- {
- plibNewPosition->LowPart = result;
- plibNewPosition->HighPart = movehigh;
- }
-
- if (result != -1)
- return NOERROR;
- else
- return E_FAIL;
- }
-
-
- STDMETHODIMP CFileStream::Stat(STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag)
- {
- memset(pstatstg, 0, sizeof(STATSTG));
-
- pstatstg->pwcsName = NULL;
- pstatstg->type = STGTY_STREAM;
-
- pstatstg->cbSize.LowPart = GetFileSize(m_hfile, &pstatstg->cbSize.HighPart);
-
- return S_OK;
- }
-